package com.pai4j.pgc.dao;


import com.pai4j.pgc.entity.ArticleEntity;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import java.util.Collection;
import java.util.List;


@Repository
public interface IArticleDAO extends JpaSpecificationExecutor<ArticleEntity>,
        JpaRepository<ArticleEntity, Long> {

    /**
     * 更新文章的状态为已推送
     * 此方法使用JPA查询注解来更新数据库中多篇文章的状态，表示这些文章已被推送
     * @Modifying：表明这是一个修改操作（如update或delete）。
     * @Query：定义自定义的JPQL查询语句。
     * 查询逻辑：更新ArticleEntity表中id在参数:ids列表中的记录，将其status字段值设置为2。
     * @param ids 文章ID的集合，这些ID标识了需要更新状态的文章
     * @return 返回值是更新操作影响的行数，即状态被更新为已推送的文章数量
     */
    @Transactional
    @Modifying
    @Query(value = "update ArticleEntity a set a.status = 2 where a.id in :ids")
    int updatePushedStatus(Collection<Long> ids);
    
    /**
     * 根据作者查询文章（过滤已删除）
     * @param author 作者
     * @param deleteFlag 删除标识（1=未删除）
     * @param pageable 分页信息
     * @return 返回一个分页对象，其中包含了指定作者的文章列表
     */
    Page<ArticleEntity> findByAuthorAndDeleteFlag(String author, Integer deleteFlag, Pageable pageable);
    
    
    /**
     * 根据专题账户查询文章（过滤已删除）
     * @param subjectId 专题账户
     * @param deleteFlag 删除标识
     * @param pageable 分页信息
     * @return 返回一个分页对象，其中包含了指定专题账户的文章列表
     */
    Page<ArticleEntity> findAllBySubjectAccountAndDeleteFlag(String subjectId, Integer deleteFlag, Pageable pageable);

    /**
     * 根据专题账户和状态查询文章（过滤已删除）
     */
    @Query(value = "select a from ArticleEntity a where a.subjectAccount = ?1 and a.status = ?2 and a.deleteFlag = ?3")
    Page<ArticleEntity> findAllBySubjectAccountAndStatusAndDeleteFlag(String subjectId, Integer status, Integer deleteFlag, Pageable pageable);

    /**
     * 根据状态查询文章（过滤已删除）
     */
    @Query(value = "select a from ArticleEntity a where a.status = ?1 and a.deleteFlag = ?2")
    Page<ArticleEntity> findByStatusAndDeleteFlag(Integer status, Integer deleteFlag, Pageable pageable);

    /**
     * 根据作者和状态查询文章（过滤已删除）
     * @param author 作者
     * @param status 文章状态
     * @param deleteFlag 删除标识
     * @param pageable 分页信息
     * @return 返回一个分页对象，其中包含了指定作者和状态的文章列表
     */
    Page<ArticleEntity> findByAuthorAndStatusAndDeleteFlag(String author, Integer status, Integer deleteFlag, Pageable pageable);

    /**
     * 根据专题账户和状态查询文章（过滤已删除）
     * @param subjectAccount 专题账户
     * @param status 文章状态
     * @param deleteFlag 删除标识
     * @param pageable 分页信息
     * @return 返回一个分页对象，其中包含了指定专题账户和状态的文章列表
     */
    Page<ArticleEntity> findBySubjectAccountAndStatusAndDeleteFlag(String subjectAccount, Integer status, Integer deleteFlag, Pageable pageable);

    /**
     * 统计指定作者的文章数量（按状态，过滤已删除）
     * @param author 作者
     * @param status 文章状态
     * @param deleteFlag 删除标识（1=未删除）
     * @return 文章数量
     */
    @Query(value = "select count(a) from ArticleEntity a where a.author = ?1 and a.status = ?2 and a.deleteFlag = ?3")
    Long countByAuthorAndStatusAndDeleteFlag(String author, Integer status, Integer deleteFlag);

    /**
     * 统计指定专题的文章数量（按状态，过滤已删除）
     * @param subjectAccount 专题账户
     * @param status 文章状态
     * @param deleteFlag 删除标识（1=未删除）
     * @return 文章数量
     */
    @Query(value = "select count(a) from ArticleEntity a where a.subjectAccount = ?1 and a.status = ?2 and a.deleteFlag = ?3")
    Long countBySubjectAccountAndStatusAndDeleteFlag(String subjectAccount, Integer status, Integer deleteFlag);

    /**
     * 统计指定作者已发布的文章数量（状态为已推送，过滤已删除）
     * @param author 作者
     * @param status 文章状态（已推送状态）
     * @param deleteFlag 删除标识（1=未删除）
     * @return 已发布文章数量
     */
    @Query(value = "select count(a) from ArticleEntity a where a.author = ?1 and a.status = ?2 and a.deleteFlag = ?3")
    Long countPublishedByAuthorAndDeleteFlag(String author, Integer status, Integer deleteFlag);

    /**
     * 统计指定专题已发布的文章数量（状态为已推送，过滤已删除）
     * @param subjectAccount 专题账户
     * @param status 文章状态（已推送状态）
     * @param deleteFlag 删除标识（1=未删除）
     * @return 已发布文章数量
     */
    @Query(value = "select count(a) from ArticleEntity a where a.subjectAccount = ?1 and a.status = ?2 and a.deleteFlag = ?3")
    Long countPublishedBySubjectAndDeleteFlag(String subjectAccount, Integer status, Integer deleteFlag);

    /**
     * 统计指定作者已删除的文章数量
     * @param author 作者
     * @param deleteFlag 删除标识（0=已删除）
     * @return 已删除文章数量
     */
    @Query(value = "select count(a) from ArticleEntity a where a.author = ?1 and a.deleteFlag = ?2")
    Long countByAuthorAndDeleteFlag(String author, Integer deleteFlag);
    
    /**
     * 统计指定专题的文章总数量（不过滤状态，只过滤删除标识）
     * @param subjectAccount 专题账户
     * @param deleteFlag 删除标识（1=未删除）
     * @return 文章总数量
     */
    @Query(value = "select count(a) from ArticleEntity a where a.subjectAccount = ?1 and a.deleteFlag = ?2")
    Long countBySubjectAccountAndDeleteFlag(String subjectAccount, Integer deleteFlag);
    
    /**
     * 根据ID列表批量查询文章
     * @param ids 文章ID列表
     * @return 文章列表
     */
    @Query(value = "select a from ArticleEntity a where a.id in :ids")
    List<ArticleEntity> findByIdIn(Collection<Long> ids);
    
    /**
     * 查询指定专题下的所有文章（用于批量操作）
     * @param subjectAccount 专题账户
     * @param deleteFlag 删除标识
     * @return 文章列表
     */
    @Query(value = "select a from ArticleEntity a where a.subjectAccount = ?1 and a.deleteFlag = ?2")
    List<ArticleEntity> findAllBySubjectAccountAndDeleteFlag(String subjectAccount, Integer deleteFlag);
    
}